package jmcnet.libcommun.security
{
	import com.adobe.cairngorm.CairngormError;
	import com.adobe.cairngorm.CairngormMessageCodes;
	
	import flash.utils.getQualifiedClassName;
	
	import jmcnet.libcommun.logger.JMCNetLogger;
	
	import mx.containers.TitleWindow;
	import mx.managers.PopUpManager;
	import mx.rpc.events.FaultEvent;
	
	public class BaseLoginWindow extends TitleWindow
	{
		private var _responderOk:Object;
		private var _responderKo:Object;
		
		[Bindable]
		protected var _username:String;
		[Bindable]
		protected var _password:String;
		
		public function BaseLoginWindow() {
			JMCNetLogger.debug("Appel BaseLoginWindow.CTOR");
			if ( getQualifiedClassName(super) == "BaseLoginWindow" )
				throw new CairngormError(CairngormMessageCodes.ABSTRACT_METHOD_CALLED, "BaseLoginWindow ne peut pas être instanciée car Abstract");
			BaseSessionManager.sessionManager.addEventListener(EventLogin.LOGIN_OK, loginOKServiceResultHandler);
			BaseSessionManager.sessionManager.addEventListener(EventLogin.LOGIN_BAD_CREDENTIALS, loginBadCredentialsServiceResultHandler);
			BaseSessionManager.sessionManager.addEventListener(FaultEvent.FAULT, loginServiceErrorHandler);
		}
		
		public function doLogin(login:String, password:String):void {
			// Call login service
			JMCNetLogger.debug("Appel doLogin login="+login);
			currentState = "";
			_username = login;
			_password = password;
			BaseSessionManager.sessionManager.openSession(_username, _password);
			JMCNetLogger.debug("Fin doLogin OK");
		}
		
		/**
		 * Appelée par le close du bouton de la titleWindow
		 */
		public function doClose():void {
			// Lorsque l'on quitte par le closeButton, le login est KO
			doInternalClose();
			BaseSessionManager.sessionManager.onAuthentication(_username, false, null,"abandon");
		}
		
		private function doInternalClose():void {
			// Lorsque l'on quitte par le closeButton, le login est KO
			BaseSessionManager.sessionManager.removeEventListener(EventLogin.LOGIN_OK,loginOKServiceResultHandler);
			BaseSessionManager.sessionManager.removeEventListener(EventLogin.LOGIN_BAD_CREDENTIALS, loginBadCredentialsServiceResultHandler);
			BaseSessionManager.sessionManager.removeEventListener(FaultEvent.FAULT, loginServiceErrorHandler);
			PopUpManager.removePopUp(this);
		}
		
		public function doReset():void {
			currentState = "";
			_username="";
			_password="";
		}
		
		public function loginOKServiceResultHandler(obj:Object):void {
			JMCNetLogger.debug("Appel BaseLoginWindow.loginOKServiceResultHandler : -> login OK");
			currentState = "";
			doInternalClose();
			if (_responderOk != null) {
				_responderOk(obj);
			}
			else {
				JMCNetLogger.warn("ATTENTION : le login est OK et on n'a pas de callback a appeler. Vérifier l'utilisation de LoginWindow");
			}
			JMCNetLogger.debug("Fin BaseLoginWindow.loginOKServiceResultHandler OK");
		}
		
		public function loginBadCredentialsServiceResultHandler(obj:Object):void {
			JMCNetLogger.info("Appel BaseLoginWindow.loginKOServiceResultHandler : le login est KO");
			currentState = "loginError";
			JMCNetLogger.info("Fin BaseLoginWindow.loginKOServiceResultHandler OK");
		}
		
		public function loginServiceErrorHandler(obj:Object):void {
			JMCNetLogger.info("Appel BaseLoginWindow.loginServiceErrorHandler : erreur pendant le login");
			doClose();
			if (_responderKo != null) {
				JMCNetLogger.debug("-> Erreur technique pendant login");
				_responderKo(obj);
			}
			else {
				JMCNetLogger.error("ATTENTION : le login est en erreur technique et on n'a pas de callback a appeler. Vérifier l'utilisation de LoginWindow");
			}
			JMCNetLogger.info("Fin BaseLoginWindow.loginServiceErrorHandler : OK");
		}
		
		public function set responderWhenOk(responder:Object):void { _responderOk = responder;	}
		public function get responderWhenOk():Object { return _responderOk; }
		
		public function set responderWhenKo(responder:Object):void { _responderKo = responder;	}
		public function get responderWhenKo():Object { return _responderKo; }
	}
}